import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']  
plt.rcParams['axes.unicode_minus'] = False

def plot_performance(file_path, capacity):
    # 读取CSV文件
    df = pd.read_csv(file_path)
    
    # 创建图形
    plt.figure(figsize=(12, 8))
    
    # 算法列表和颜色、标记、线型
    algorithms = ['暴力算法(ms)', '回溯算法(ms)', '动态规划(ms)', '贪心算法(ms)']
    colors = ['red', 'blue', 'green', 'purple']
    markers = ['o', 's', '^', 'D']
    linestyles = ['-', '--', '-.', ':']
    
    # 循环绘制每种算法的折线
    for alg, color, marker, ls in zip(algorithms, colors, markers, linestyles):
        # 将'timeout'替换为1e9，并将数据转换为数值类型
        y_values = df[alg].replace('timeout', 1e9).astype(float)
        
        # 绘制线条
        plt.plot(df['Items数量'], 
                y_values,
                label=alg, 
                color=color, 
                marker=marker,
                markersize=6,
                linewidth=2,
                linestyle=ls)
    
    # 设置图表标题和标签
    plt.title(f'背包容量{capacity}时各算法性能比较', fontsize=14)
    plt.xlabel('物品数量', fontsize=12)
    plt.ylabel('执行时间 (ms)', fontsize=12)
    
    # 设置对数刻度
    plt.yscale('log')
    plt.xscale('log')
    
    # 设置y轴的范围，确保能看到所有线条
    plt.ylim(0.1, 1e10)
    
    # 添加网格
    plt.grid(True, which="both", ls="-", alpha=0.2)
    
    # 添加timeout标记线
    plt.axhline(y=1e9, color='gray', linestyle='--', alpha=0.5)
    plt.text(df['Items数量'].min(), 2e9, 'Timeout', fontsize=10, color='gray')
    
    # 添加图例
    plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=10)
    
    # 调整布局
    plt.tight_layout()
    
    # 保存图片
    plt.savefig(f'performance_capacity_{capacity}.png', dpi=300, bbox_inches='tight')
    plt.close()

# 绘制三个容量的图表
capacities = [10000, 100000, 1000000]
for capacity in capacities:
    file_path = f'capacity{capacity}下四种算法在不同的items数下的Time表现.csv'
    plot_performance(file_path, capacity)

print("图表已生成完成！")
